#include <iostream>
#include <thread>
#include <chrono>
#include <sw/redis++/redis++.h>

#include "util.hpp"

using namespace std::chrono_literals;

void test1(sw::redis::Redis& redis)
{
    std::cout << "lpush 和 lrange" << std::endl;
    redis.flushall();

    redis.lpush("key", "111");
    redis.lpush("key", "222");
    redis.lpush("key", "333");

    redis.lpush("key", {"444", "555", "666"});

    std::vector<std::string> values = {
        "777", "888", "999"
    };

    redis.lpush("key", values.begin(), values.end());

    std::vector<std::string> result;
    std::back_insert_iterator<std::vector<std::string>> it = std::back_insert_iterator<std::vector<std::string>>(result);
    redis.lrange("key", 0, -1, it); 

    printContainer(result);
}

void test2(sw::redis::Redis& redis)
{
    std::cout << "rpush" << std::endl;
    redis.flushall();

    redis.rpush("key", "111");
    redis.rpush("key", "222");
    redis.rpush("key", "333");

    redis.rpush("key", {"444", "555", "666"});

    std::vector<std::string> values = {
        "777", "888", "999"
    };

    redis.rpush("key", values.begin(), values.end());

    std::vector<std::string> results;
    std::back_insert_iterator<std::vector<std::string>> it = std::back_insert_iterator<std::vector<std::string>>(results);

    redis.lrange("key", 0, -1, it);
    printContainer(results);
}

void test3(sw::redis::Redis& redis)
{
    std::cout << "lpop 和 rpop" << std::endl;
    redis.flushall();

    redis.rpush("key", {"1", "2", "3", "4"});

    sw::redis::OptionalString result = redis.lpop("key");
    if (result)
    {
        std::cout << "lpop: " << result.value() << std::endl;
    }

    result = redis.rpop("key");
    if (result)
    {
        std::cout << "rpop: " << result.value() << std::endl;
    }
}

void test4(sw::redis::Redis& redis)
{
    using namespace std::chrono_literals;
    std::cout << "blpop" << std::endl;
    redis.flushall();

    // redis.lpush("key", {"111", "222", "333"});
    
    sw::redis::OptionalStringPair result = redis.blpop("key", 10s);
    if (result)
    {
        std::cout << "key: " << result.value().first << std::endl;
        std::cout << "elem: " << result.value().second << std::endl;
    }
    else
    {
        std::cout << "result 为无效值" << std::endl;
    }
}

void test5(sw::redis::Redis& redis)
{
    std::cout << "llen" << std::endl;
    redis.flushall();
    
    redis.lpush("key", {"111", "222", "333", "444"});
    long long result = redis.llen("key");

    std::cout << "len: " << result << std::endl;
}

int main()
{
    sw::redis::Redis redis("tcp://127.0.0.1:6379");

    // test1(redis);
    // test2(redis);
    // test3(redis);
    // test4(redis);
    test5(redis);

    return 0;
}